package com.g7.dsp.test.swing.processbar;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JTextField;


//那这个程序是否没有问题了呢？   
//我们自定义了一个线程GoThread，在这里我们完成了那些耗时的工作，可以看作是“工作线程”，   
//而对于组件的更新，我们也放在了“工作线程”里完成了。   
//在这里，在事件派发线程以外的线程里设置进度条，是一个危险的操作，运行是不正常的。（对于输入框组件的更新是安全的。）   
public class SwingThreadTest2 extends JFrame {   
	 private static final long serialVersionUID = 1L;   
	 private static final String STR = "Completed : ";   
	 private JProgressBar progressBar = new JProgressBar();   
	 private JTextField text = new JTextField(10);   
	 private JButton start = new JButton("Start");   
	 private JButton end = new JButton("End");   
	 private boolean flag = false;   
	 private int count = 0;   
	    
	 GoThread t = null;   
	 public SwingThreadTest2() {   
	  this.setLayout(new FlowLayout());   
	  add(progressBar);   
	  text.setEditable(false);   
	  add(text);   
	  add(start);   
	  add(end);   
	  start.addActionListener(new Start());   
	  end.addActionListener(new End());   
	 }   
	 
	 private void go() {   
	  while (count < 100) {   
	   try {   
	    Thread.sleep(100);   
	   } catch (InterruptedException e) {   
	    e.printStackTrace();   
	   }   
	   if (flag) {   
	    count++;   
	    System.out.println(count);   
	    progressBar.setValue(count);   
	    text.setText(STR + String.valueOf(count) + "%");   
	   }   
	  }   
	 }   
	 
	 private class Start implements ActionListener {   
	  public void actionPerformed(ActionEvent e) {   
	   flag = true;   
	   if(t == null){   
	    t = new GoThread();   
	    t.start();   
	   }   
	  }   
	 }   
	 //执行复杂工作，然后更新组件的线程   
	 class GoThread extends Thread{   
	  public void run() {   
	   //do something...   
	   go();   
	  }   
	 }   
	 private class End implements ActionListener {   
	  public void actionPerformed(ActionEvent e) {   
	   flag = false;   
	  }   
	 }   
	 public static void main(String[] args) {   
	  SwingThreadTest2 fg = new SwingThreadTest2();   
	  fg.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
	  fg.setSize(300, 100);   
	  fg.setVisible(true);   
	 }   
	}   